#include <math.h>
#include <iostream>
using namespace std;

#include "creadorceldastriangulares.h"

CreadorCeldasTriangulares::CreadorCeldasTriangulares()
{
    //ctor
}

CreadorCeldasTriangulares::~CreadorCeldasTriangulares()
{
    //dtor
}

const Referencia<Celda> CreadorCeldasTriangulares::crearCelda(real x, real y, int columna, int fila)
{
    Referencia<Celda> celda(new Celda);

    real altura = getDesplazamientoY();

    real dxCentro = 0;
    real dyCentro = 0;

    int numeroSecuencia = (columna + 60 + 3 * (fila % 2)) % 6;

    switch (numeroSecuencia)
    {
    case 0:
        break;

    case 1:
        dxCentro = lado / 2;
        break;

    case 2:
        dxCentro = - lado / 2;
        dyCentro = altura;
        break;

    case 3:
        dyCentro = altura;
        break;

    case 4:
        dxCentro = lado / 2;
        dyCentro = altura;
        break;

    case 5:
        dxCentro = - lado / 2;
        break;
    }


//    dxCentro = getDesplazamientoX() * (columna % 2);
//    dyCentro = getDesplazamientoY() * ((fila + 1) % 2);


    Punto centro(x - dxCentro, y + dyCentro);
    celda->setCentro(centro);
    celda->setNumeroSecuencia(numeroSecuencia);
    celda->setFila(fila);
    celda->setColumna(columna);

    if ((fila + columna) % 2)
    {
        // celda impar (el vertice p1 del triangulo apunta hacia abajo)
        Punto p1(x, y + altura);
        Punto p2(x - lado / 2, y);
        Punto p3(x + lado / 2, y);
        celda->agregarPunto(p1);
        celda->agregarPunto(p2);
        celda->agregarPunto(p3);
        celda->agregarPunto(p1);
    }
    else
    {
        // celda par (el vertice p1 del triangulo apunta hacia arriba)
        Punto p1(x, y);
        Punto p2(x - lado / 2, y + altura);
        Punto p3(x + lado / 2, y + altura);
        celda->agregarPunto(p1);
        celda->agregarPunto(p2);
        celda->agregarPunto(p3);
        celda->agregarPunto(p1);
    }

    return celda;
}

